package HashTable;

import java.util.*;

/*      给你两个整数数组 nums1 和 nums2 ，请你以数组形式返回两数组的交集。
        返回结果中每个元素出现的次数，应与元素在两个数组中都出现的次数一致（如果出现次数不一致，则考虑取较小值）。可以不考虑输出结果的顺序。
        示例 1：
        输入：nums1 = [1,2,2,1], nums2 = [2,2]
        输出：[2,2]

        示例 2:
        输入：nums1 = [4,9,5], nums2 = [9,4,9,8,4]
        输出：[4,9]*/
public class lc350 {
    public static void main(String[] args) {
        int[] nums1=new int[]{1,2,2,1};
        int[] nums2=new int[]{2,2};
        int[] result=intersect(nums1,nums2);
        for (int val:result
             ) {
            System.out.print(val+" ");
        }

    }
    public static int[] intersect(int[] nums1, int[] nums2) {
        //统计num1中各个元素的出现次数
        HashMap<Integer,Integer> map1=new HashMap<>();
        for (int val:nums1
             ) {
            if(!map1.containsKey(val)){
                map1.put(val,1);
            }else{
                int count=map1.get(val);
                count++;
                map1.put(val,count);
            }
        }
        //统计num2中各个元素的出现次数
        HashMap<Integer,Integer> map2=new HashMap<>();
        for (int val:nums2
        ) {
            if(!map2.containsKey(val)){
                map2.put(val,1);
            }else{
                int count=map2.get(val);
                count++;
                map2.put(val,count);
            }
        }
      //  HashSet set= (HashSet) map1.keySet();
        //遍历map1，获取各个key对应的value数值与map2中对照
        //若key同时存在于两个map中，即将数字和对应的次数加入数组
        ArrayList list=new ArrayList<>();
        for (Map.Entry<Integer,Integer> e:map1.entrySet()
             ) {
            Integer i1=e.getKey();
            if(map2.containsKey(i1)){
                Integer i3=e.getValue();
                int count1=i3.intValue();
                Integer i2=map2.get(i1);
                int count2=i2.intValue();
                int mincount=Math.min(count1,count2);
                for (int i = 0; i <mincount ; i++) {
                    list.add(i1);
                }
            }
        }
        int[] result=new int[list.size()];
        for (int i = 0; i < result.length ; i++) {
            result[i]= (int) list.get(i);
        }
        return  result;

    }
}
